/**
 * 自定义实现
 * 1. infer 在这里用于提取函数类型的返回值
 * 2.ReturnType<T> 只是将 infer R 从参数位置移动到返回值位置，因此此时 R 即是表示待推断的返回值类型
 */
type MyReturnType<T extends (...args: any[]) => any> = T extends (
    ...args: any[]
) => infer R
    ? R
    : any

type Func = (value: number) => string
type FuncReturnType = ReturnType<Func>
// type FuncReturnType = string
const foo: ReturnType<Func> = "1"
